package com.l024.framework.cloud;

import android.content.Context;

import com.l024.framework.utils.Logutils;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.List;

import io.rong.imlib.IRongCallback;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.message.TextMessage;

/**
 * 融云服务
 */
public class CloudManager {
    private static volatile CloudManager cloudManager;
    //Key
    public static final String CLOUD_SECRET = "GBnF9N5BXb2L";
    public static final String CLOUD_KEY = "lmxuhwagleu7d";
    //ObjectName
    //文字
    public static final String MSG_TEXT_NAME = "RC:TxtMsg";
    //图片
    public static final String MSG_IMG_NAME = "RC:ImgMsg";
    //位置
    public static final String MSG_LBS_NAME = "RC:LBSMsg";
    //Msg Type
    //普通消息
    public static final String TYPE_TEXT = "TYPE_TEXT";
    //添加好友
    public static final String TYPE_ADD_FRIEND = "TYPE_ADD_FRIEND";
    //同意添加好友
    public static final String TYPE_AGREED_FRIEND = "TYPE_AGREED_FRIEND";
    private CloudManager() {
    }

    public static CloudManager getInstance(){
        if(cloudManager==null){
            synchronized (CloudManager.class){
                if(cloudManager==null){
                    cloudManager = new CloudManager();
                }
            }
        }
        return cloudManager;
    }

    /**
     * 初始化融云sdk
     * @param mContext
     */
    public void initCloud(Context mContext){
        RongIMClient.init(mContext);
    }

    /**
     * 连接融云服务
     */
    public void connect(String token){
        Logutils.i("开始连接融云:token"+token);
        RongIMClient.connect(token, new RongIMClient.ConnectCallback() {
            @Override
            public void onTokenIncorrect() {
                Logutils.i("token错误");
            }

            @Override
            public void onSuccess(String s) {
                Logutils.i("连接成功:"+s);
                //测试发送消息
            }

            @Override
            public void onError(RongIMClient.ErrorCode errorCode) {
                Logutils.i("连接失败:"+errorCode);
            }
        });
    }

    /**
     * 断开连接
     * <p>断开与融云服务器的连接。当调用此接口断开连接后，仍然可以接收 Push 消息。</p>
     * <p>若想断开连接后不接受 Push 消息，可以调用{@link #logout()}</p>
     */
    public void disconnect(){
        RongIMClient.getInstance().disconnect();
    }

    /**
     * <p>断开与融云服务器的连接，并且不再接收 Push 消息。</p>
     * <p>若想断开连接后仍然接受 Push 消息，可以调用 {@link #disconnect()}</p>
     */
    public void logout(){
        RongIMClient.getInstance().logout();
    }

    /**
     * 监听消息
     * 如果您基于 IMLib SDK 进行开发，那在初始化 SDK 之后，即可通过 RongIMClient.getInstance() 方法获取实例，然后调用相应的 API 方法即可。
     */
    public void setOnReceiveMessageListener(RongIMClient.OnReceiveMessageListener listener){
        RongIMClient.getInstance().setOnReceiveMessageListener(listener);
    }

    /**
     * 发送文本消息
     * 会话类型
     * 单聊	PRIVATE
     * 群组	GROUP
     * 聊天室 CHATROOM
     */
    public void sendTextMessage(String msg,String targetId){
        TextMessage textMessage = TextMessage.obtain(msg);
        /**
         *  @param type        会话类型。
         *  * @param targetId    目标 Id。根据不同的 conversationType，可能是用户 Id、群组 Id 或聊天室 Id。
         *  * @param content     消息内容，例如 {@link TextMessage}, {@link ImageMessage}。
         *  * @param pushContent 当下发 push 消息时，在通知栏里会显示这个字段。
         *  *                    如果发送的是自定义消息，该字段必须填写，否则无法收到 push 消息。
         *  *                    如果发送 sdk 中默认的消息类型，例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg，则不需要填写，默认已经指定。
         *  * @param pushData    push 附加信息。如果设置该字段，用户在收到 push 消息时，能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
         *  * @param callback    发送消息的回调。
         */
        RongIMClient.getInstance().sendMessage(Conversation.ConversationType.PRIVATE,
                targetId, textMessage, null, null,iSendMessageCallback);
    }

    /**
     * 发送一个添加好友的文本消息
     */
    public void sendAddFrientMessage(String msg,String type,String targetId){
        JSONObject jsonObject = new JSONObject();
        try{
            jsonObject.put("msg",msg);
            //没有type就是发送普通消息
            jsonObject.put("type",type);
            sendTextMessage(jsonObject.toString(),targetId);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 发送消息回调
     */
    private IRongCallback.ISendMessageCallback iSendMessageCallback = new IRongCallback.ISendMessageCallback() {
        @Override
        public void onAttached(Message message) {
            // 消息成功存到本地数据库的回调
            Logutils.i("消息成功存到本地数据库的回调："+message);
        }

        @Override
        public void onSuccess(Message message) {
            // 消息发送成功的回调
            Logutils.i("消息发送成功的回调："+message);
        }
        @Override
        public void onError(Message message, RongIMClient.ErrorCode errorCode) {
            // 消息发送失败的回调
            Logutils.e("消息发送失败的回调：errorCode:"+errorCode+" message:"+message);
        }
    };

    /**
     * 查询本地会话记录
     */
    public void getConversationList(final RongIMClient.ResultCallback<List<Conversation>> callback){
        RongIMClient.getInstance().getConversationList(callback);
    }
}
